/**
 * static在不同的上下文中具有不同的含义
 *   全局变量具有static duration，这意味着它们在程序启动时创建，并在程序结束时销毁
 *   static关键字如何给出全局标识符internal linkage，这意味着标识符只能在定义它的文件中使用
 *   static在局部变量上使用关键字将其持续时间从 更改automatic duration为static duration。
 * 这意味着变量现在在程序开始时创建，并在程序结束时销毁（就像全局变量一样）。因此，静态变量即使超出范围也将保留其值！
 * 
 * 局部变量默认具有automatic duration默认值，这意味着它们在定义时创建，并在退出块时销毁
 * 
 * 最佳实践
 *   初始化静态局部变量。静态局部变量仅在第一次执行代码时初始化，而不会在后续调用时初始化。
 *   避免使用static局部变量，除非该变量永远不需要重置。
 * 
 * 
 */

#include <iostream>

void incrementAndPrint()
{
    int value{ 1 }; // automatic duration by default
    ++value;
    std::cout << value << '\n';
} // value is destroyed here

void incrementAndPrint2()
{
    static int s_value{ 1 }; // static duration via static keyword.  This initializer is only executed once.
    ++s_value;
    std::cout << s_value << '\n';
} // s_value is not destroyed here, but becomes inaccessible because it goes out of scope

int main()
{
    incrementAndPrint();
    incrementAndPrint();
    incrementAndPrint();

    std::cout << "=======================\n";

    incrementAndPrint2();
    incrementAndPrint2();
    incrementAndPrint2();

    return 0;
}